//
//  TLFMDB.m
//  Books
//
//  Created by 故乡的云  on 2017/4/8.
//  Copyright © 2017年 故乡的云. All rights reserved.
//


#import "TLFMDB.h"
#import <FMDB/FMDB.h>

#warning 3.导入模型头文件 & 设置要创建的数据库名称
#import "TLChengYu.h"
#define TLSQLITE_FILENAME @"t_data" // 数据库文件名称,名称不能带后缀

@implementation TLFMDB
static FMDatabase *_fmdb;

+ (void)initialize {
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    NSString*path = [cachePath stringByAppendingPathComponent:TLSQLITE_FILENAME];
    _fmdb = [[FMDatabase alloc] initWithPath:path];
    [_fmdb open];
        
#warning 4.设置数据库属性
    NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, pinYin TEXT NOT NULL, zhuShi TEXT NOT NULL, liJu TEXT, dianGu TEXT)",TLSQLITE_FILENAME];
    bool result = [_fmdb executeUpdate:sql];
    
    if (result) { // 创建／打开数据库成功
        NSLog(@"创建／打开 %@ 成功！",TLSQLITE_FILENAME);
    }else { // 失败
        NSLog(@"创建／打开 %@ 失败！ 您的DDL语句：%@",TLSQLITE_FILENAME,sql);
    }
}


/* 插入语句（DML）
 * 格式：insert into 表名 (字段1, 字段2, …) values (字段1的值, 字段2的值, …) ;
 * 示例：insert into t_student (name, age) values (‘名字’, 10) ;
 
 注意
 数据库中的字符串内容应该用单引号 ‘’ 括住  */
#warning 5.方法更新Model类型，及sql语句属性对应关系
/// 插入模型数据
+ (BOOL)insertModel:(TLChengYu *)model {
    NSString *insertSql = [NSString stringWithFormat:@"INSERT INTO %@(name, pinYin, zhuShi, liJu, dianGu) VALUES ('%@', '%@','%@', '%@', '%@');", TLSQLITE_FILENAME, model.name,model.pinYin,model.zhuShi,model.liJu,model.dianGu];
    bool result = [_fmdb executeUpdate:insertSql];
    if (result) { // 创建／打开数据库成功
        NSLog(@"插入数据到 %@ 成功！",TLSQLITE_FILENAME);
    }else { // 失败
        NSLog(@"插入数据到 %@ 失败！ 您的DML语句：%@",TLSQLITE_FILENAME,insertSql);
    }
    return result;
}

/* 查询语句（DQL）
 * 关键字： select、 where、 order by、 group by、 having
 * 格式：
        查询指定字段：SELECT 字段1, 字段1,...  FROM 表名;
        查询所以字段：SELECT * FROM 表名;
        条件查询：   SELECT 字段1, 字段1,...  FROM 表名 where 条件;
    
        条件语句常用格式：
             条件语句的常见格式
             where 字段 = 某个值 ;   // 不能用两个 =
             where 字段 is 某个值 ;   // is 相当于 =
             where 字段 != 某个值 ;
             where 字段 is not 某个值 ;   // is not 相当于 !=
             where 字段 > 某个值 ;
             where 字段1 = 某个值 and 字段2 > 某个值 ;  // and相当于C语言中的 &&
             where 字段1 = 某个值 or 字段2 = 某个值 ;  //  or 相当于C语言中的 ||  */
/// 查询数据,如果 传空 默认会查询表中所有数据（返回Model数组）
+ (NSArray *)queryData:(NSString *)conditionSQL {
    NSString *querySql;
    if (conditionSQL == nil) {
        querySql = [NSString stringWithFormat:@"SELECT * FROM %@;",TLSQLITE_FILENAME];
    }else {
        querySql = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@;",TLSQLITE_FILENAME,conditionSQL];
    }
    
    NSMutableArray *arrM = [NSMutableArray array];
    FMResultSet *set = [_fmdb executeQuery:querySql];
    if (set) { // 查询成功
        NSLog(@"查询 %@ 中数据成功！",TLSQLITE_FILENAME);
    }else { // 查询失败
        NSLog(@"查询 %@ 中数据失败！ 您的DML语句：%@",TLSQLITE_FILENAME,querySql);
    }
    
#warning 5.将查询到的数据转化为模型
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    while ([set next]) {
        dict[@"name"] = [set stringForColumn:@"name"];
        dict[@"pinYin"] = [set stringForColumn:@"pinYin"];
        dict[@"zhuShi"] = [set stringForColumn:@"zhuShi"];
        dict[@"liJu"] = [set stringForColumn:@"liJu"];
        dict[@"dianGu"] = [set stringForColumn:@"dianGu"];
        TLChengYu *modal = [TLChengYu chengYuWithDict:dict];
        [arrM addObject:modal];
    }
    return arrM;
}

/* 删除语句（DML）
 * 删除表中所有内容： delete from 表名 ;
 * 条件删除： delete from 表名 where 条件 ; */
/// 删除数据, @ conditionSQL 是删除条件（SQL语句）,nil: 删除表中所有数据 ，
+ (BOOL)deleteDataWithCondition:(NSString *)conditionSQL {
    NSString *sql;
    if(conditionSQL == nil) {
        sql = [NSString stringWithFormat:@"DELETE FROM %@",TLSQLITE_FILENAME];
    }else {
        sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@",TLSQLITE_FILENAME,conditionSQL];
    }
    bool result = [_fmdb executeUpdate:sql];
    
    if (result) { // 查询成功
        NSLog(@"删除 %@ 中数据成功！",TLSQLITE_FILENAME);
    }else { // 查询失败
        NSLog(@"删除 %@ 中数据失败！ 您的DML语句：%@",TLSQLITE_FILENAME,sql);
    }
    return result;
}

/*修改语句（DML）
 * 格式：update 表名 set 字段1 = 字段1的值, 字段2 = 字段2的值, … ;
 */
/// 修改数据
+ (BOOL)updateWithModel:(TLChengYu *)model toNewMOdel:(TLChengYu *)newModel {
    if (model == nil || newModel == nil ) {
        return NO;
    }
    NSString *modifySql = [NSString stringWithFormat:@"UPDATe %@ SET name = \'%@\',pinYin = \'%@\',zhuShi = \'%@\',liJu = \'%@\',dianGu = \'%@\' WHERE name = \'%@\'",
                           TLSQLITE_FILENAME,newModel.name,newModel.pinYin,newModel.zhuShi,newModel.liJu,newModel.dianGu,model.name];
    bool result = [_fmdb executeUpdate:modifySql];
    if (result) { // 修改成功
        NSLog(@"修改 %@ 中数据成功！",TLSQLITE_FILENAME);
    }else { // 修改失败
        NSLog(@"修改 %@ 中数据失败！ 您的DML语句：%@",TLSQLITE_FILENAME,modifySql);
    }
    return result;
}

@end
